perm filename HOMNEW.FAI[XX,LCS]1 blob
sn#192544 filedate 1975-12-16 generic text, type T, neo UTF8
00100 TITLE HOMNEW
00200 ENTRY HOMNEW
00300 EXTERNAL .COMM.,POSI,PTR,XRN,STF,AMOD,FINDIT,ALF,PLACE
00400 MM←1 ↔ NN←2
00500 JK←3 ↔JT←4 ↔A←6 ↔K←7↔ IS←10↔ IZ←11↔ R←12↔ L←13
00600 RC←14 ↔ NX←15 ;**** AC'S 0,1,2,3,5 ARE USED IN 'PLACE' & 'FINDIT'!!
00700 ;;C****** FOR 'HOMING' OF BEAMS AND CHORD NOTES ***********
00800 ;; SUBROUTINE HOMER
00900 ;; IMPLICIT INTEGER(A-Q,S-Z)
01000 ;; REAL PWDS,DISX,A,B,PLACE,STFF
01100 ;; COMMON /STF/RSTFAC(-3/4),RSTJ2
01200 ;; COMMON R2,JA,CENTR,J2,RJQ(20),JQ(20) /POSI/STFF(-3/4),JJ2,POS
01300 ;; COMMON /XRN/RN(4000) /PTR/PWDS(250),ITEM,L,I,IX
01400 ;; COMMON/ALF/QQ(3),K,RA,RB,N,RG,M,X,RE,RF,A,B,DISX,INP(58)
01500 ;; EQUIVALENCE (R3,RJQ(1)),(R6,RJQ(4)),(JT,JQ(9)),(RD,RN(4000))
01600 ;; 1,(R7,RJQ(5)),(R9,RJQ(7)),(R11,RJQ(9)),(R13,RJQ(11))
01700 ;; 1,(J10,JQ(8)),(R8,RJQ(6)),(J7,JQ(5))
01800
01900 DEFINE FIXX(N)
02000 < JUMPGE N,.+5
02100 MOVNS N
02200 FIX N,233000
02300 MOVNS N
02400 CAIA
02500 FIX N,233000 > ; TO FIX IT LIKE 'IFIX' DOES.
02600 HOMNEW: 0 ; IF(JA.EQ.6)GO TO 9
02700 SETOM ALF+1 ; FLAG FOR DIFF. STAVES
02800 MOVE K,.COMM. ;JJ2=R2
02900 FIXX(K)
03000 ; JJ2 FOR RUNTHR
03100 MOVE K,PTR-1(K) ;K=PWDS(JJ2) ← BEAM PTR.
03200 MOVE XRN(K)
03300 CAME [6.0] ; IS IT REALLY A BEAM?
03400 JRA 16,(16) ;NO - GO BACK
03500 ;******* 19, ITEM# OF BEAM, STAFF# FOR RT. SIDE OF BEAM.
03600 MOVE R,XRN+5(K)
03700 SETZ MM, ; 0=BEAM STEM ↓
03800 MOVE XRN+6(K) ;RN(K+7) STEM DIR.
03900 CAMGE [20.0] ;IS IT UP?
04000 SETO MM, ; YES -1=BEAM STEM ↑
04100 MOVE 6,[1.0]
04200 MOVE 5,.COMM.+4 ; 2ND PARAM
04300 CAMLE 5,[4.0] ;.GT.4 =0
04400 SETZ 5,
04500 MOVEM 5,ALF+5 ; SAVE NOTES' STAFF #
04600 SETZ L, ; NEXT IS SEARCH LOOP
04700 H401N: MOVE 3,PTR(L) ; 3=KWDS(L)
04800 CAME 5,XRN+1(3) ;IF RN(3).NE.STF, SKIP
04900 JRST H402N
05000 CAME 6,XRN(3) ; IS IT A NOTE?
05100 JRST H402N ; NO
05200 MOVE XRN+2(3) ;POS OF NOTE
05300 FSBR R ; NOTE POS - RT. SIDE OF BEAM
05400 MOVM ; ABS. VALUE
05500 CAMG [2.5] ; + OR - 2.5 RANGE FOR HOMING
05600 JRST H403N ; NO CLOSE ENOUGH
05700 H402N: AOJ L, ; ADD ONE FOR LOOP
05800 CAMGE L,PTR+=250 ; UP TO ITEM YET?
05900 JRST H401N
06000 JRA 16,(16) ;COULDN'T HOME IN.
06100 H403N: MOVE L,PTR(L) ; PTR TO RIGHT NOTE
06200 MOVEI JK,XRN(L) ; (RB) PTR TO NOTE
06300 MOVE 2(JK)
06400 MOVEM ALF+=19 ;SAVE PTR TO POS OF NOTE IN ALF+=19.
06500
06600 ;L=PWDS(JQ(1)) ← NOTE PTR.
06700 ;RA=RN(K+3)
06800 ;SAVE LOC OF RN(K+1)
06900 ;RB=RN(L+3)
07000 MOVM RC,3(JK) ; RN(L+4)
07100 MOVE NX,[1.0]
07200 ;; SKIPGE RC
07300 ;; MOVNS RC
07400 CAMGE RC,[90.0]
07500 JRST .+2 ;*******************
07600 MOVE NX,[0.6] ; FOR MINI NOTES AND BEAMS
07700 ;; MOVE RC,[0.7] ;FOR MINI STEM
07800 ;; SKIPA
07900 ;; MOVE RC,[1.0]
08000 H400N: MOVEM JK,ALF+=20 ;LOC OF RN(L+1)
08100 ;N MOVE IZ,2(JK) ; RB=POS OF NOTE, RA=POS(P3) OF BEAM
08200 SETZM ALF+=17 ;N=0
08300 MOVE 0,4(JK) ;IF(RN(L+5).LT.20)N=-1
08400 CAMGE 0,[=20.0]
08500 SETOM ALF+=17 ; -1 MEANS NOTE'S STEM IS UP
08600 MOVN 0,XRN+6(K) ;RG=-(AMOD(RN(K+7),10.)-1.)[*NX]*11./7.
08700 MOVEM 0,ALF+=13 ;RN(K+7)
08800 MOVEM MM,ALF+=21 ;SAVE IT 'TIL AFTER AMOD
08900 JSA 16,AMOD
09000 JUMP ALF+=13
09100 JUMP [=10.0]
09200 FADR 0,[=1.0]
09300 FMPR 0,[=1.5714]
09400 FMPR 0,NX ; *RMINI (.6)
09500 MOVEM 0,ALF+=15 ;RG SAVED IN ALF+=15
09600 ; VERTICAL SPACE FOR THE NUMB. OF BEAMS
09700 MOVE MM,ALF+=21 ;GET BACK STEM DIR.
09800 MOVE L,ALF+=20 ;JT=RN(L+2) ←STAFF # OF NOTE
09900 MOVE JT,1(L)
10000 FIXX(JT) ; JT IS IN JT
10100 MOVE JK,XRN+1(K) ;JK=RN(K+2) ←STAFF # OF BEAM
10200 MOVEM JK,ALF+=8 ; SAVE BEAM'S STAFF #
10300 FIXX(JK) ; JK IS IN JK
10400 ; THE STAFF NUMS. JK=BEAM JT=NOTE
10500 MOVE IS,STF+3(JK) ;R3=RSTFAC(JK) R3 IS IN 'IS'
10600 FMPR IS,NX ; *RMINI (.6)
10700 ;; MOVE IZ,STF+3(JT) ;R9=RSTFAC(JT)/R3
10800 FMPR IS,[=2.43959732] ;R8=R3*14.54/5.96
10900 MOVEM IS,ALF+=14
11000 ; R8=WIDTH OF NOTE
11100
11200 ; ALF+=14= IS = WIDTH OF NOTE -- NEEDED BECAUSE OF DIFF. STEM DIRECTIONS.
11300
11400
11500 ;******* 5/74 BOTH STAVES MUST BE SAME SIZE - MOST LALF+=19ELY ********
11600 CAME MM,ALF+=17 ;3 IF(M.NE.N)GO TO 5
11700 JRST H5N ; JUMP IF STEMS GO DIF. DIRECTIONS
11800 SETZ IS, ;R8=0 NOTE WIDTH
11900 SETZM ALF+=14 ; ALSO NOTE WIDTH
12000 SETO MM, ;REVERSE STEM DIR. BECAUSE IT'S REVERSED LATER
12100 SKIPE ALF+=17
12200 SETZ MM,
12250 MOVEM MM,ALF+=17
12300 SETZM ALF+=15 ;RG=0 VERT SPACE FOR # OF BEAMS
12400 SETZ IZ,
12500 JRST H4N ;GO TO 4N
12600 H5N: SKIPE MM ;5 IF(M.EQ.0)GO TO 4N
12700 MOVNS IS ;R8=-R8
12800 MOVE IZ,[13.71428571] ;=96/2 DBL STNDRD STEM LNGTH + CRAP
12900 FMPR IZ,NX ; *RMINI (.6 -- FOR MINI-NOTES)
13000
13100 ; NOT OK IF DIFF SIZES AND RA.GT.RB ****** 5/74
13200 H4N: FADR IS,ALF+=19 ;4 RN(K+6)=RB+R8
13300 MOVEM IS,XRN+5(K) ;SETS CORRECT HORIZONTAL PARAM OF BEAM.
13400 MOVE [=7.0] ; AC0=SPACE FOR ONE DIATONIC STEP(VERTICAL)
13500 FMPR STF+3(JK) ; *STAFF SIZE FACTOR RF=7.*R9
13600 MOVE NN,POSI+3(JT)
13700 FSBR NN,POSI+3(JK) ; RE=(STFF(JT)-STFF(JK))/RF
13800 FDVR NN,0 ; DIST BETWEEN STAVES.
13900 MOVM NN,NN
14000 FSBR IZ,NN ;SUBTRAC. DBL STEM LNGTH FROM DIFF BETWEEN STAVES.
14100 ;MAKE DIFF BETWEEN STAVE ALWAYS POS.
14200 FADRM IZ,ALF+=15 ;" SPACE FOR MULTIPLE BEAMS, PUT IT IN ALF+=15
14300 ;; MOVMS ALF+=15 ; ALF+=15 HAS SPACE DIFFERENCE IN VERT. NOTE SPACES.
14400 SKIPN MM
14500 MOVNS ALF+=15
14600 MOVE JK,MM
14700 CAMN MM,ALF+=17 ; BOTH STEMS SAME DIR.?
14800 MOVNS ALF+=15 ; YES
14900 MOVEI MM,2
15000 SKIPN JK
15100 MOVEI MM,1 ; -1 BECOMES 2, 0 BECOMES 1.
15200 MOVEM MM,ALF ;REVERSES STEM DIR. FOR LATER USE. SAVES IN ALF
15300
15400 ;; IS=NOTE WIDTH, ALF+=15 =DIST. BETWEEN STAVES, +HGT OF BEAM GROUP ETC.
15500 ;; LEFT=LEFT SIDE OF BEAM, RIGHT=RIGHT SIDE
15600
15700
15800
15900 ; NEXT ADJUSTS STEMS WHEN BEAMS ARE USED.
16000 H197N: MOVE PTR+=250 ;197 JJ2=ITEM
16100 MOVEM POSI+=8
16200 MOVE R,.COMM. ;R3=R2
16300 MOVEM R,ALF+=16
16400 SETZ K, ;DO 191 K=1,ITEM
16500 SKIPN ALF+1 ; JUMP TO H191N IF DOING ORDINARY HOMING.
16600 JRST H191N
16700 MOVE K,.COMM.
16800 FIXX(K)
16900 SOJ K, ; NOW WE LOOK AT ONLY ONE BEAM (FOR DIFF. STAVES.)
17000 MOVE ALF+=8 ; GET BACK STAFF # OF BEAM
17100 MOVEM ALF+=16
17200 H191N: MOVEM K,ALF+=11 ;SAVE K L=PWDS(K)
17300 MOVE L,PTR(K) ; L IS PWDS(K+1)
17400 ;IF(RN(L+1).NE.6)GO TO 191
17500 MOVEI R,XRN(L)
17600 MOVE A,(R)
17700 CAME A,[=6.0]
17800 JRST HX191N
17900 MOVE JK,ALF+=16 ;IF(RN(L+2).EQ.R3)GO TO 77
18000 CAMN JK,1(R)
18100 JRST H77N
18200 CAMGE JK,[=5.0] ;IF(R3.LT.5.)GO TO 191
18300 JRST HX191N ; TYPE 19 99 FOR ALL STAVES
18400 H77N: MOVE JK,-1(R) ;77
18500 CAMN JK,[=8.0] ;IF(RN(L).EQ.8)GO TO 191
18600 JRST HX191N
18700 MOVE JK,6(R) ;IF(RN(L+7).LT.10.)GO TO 191
18800 CAMGE JK,[=10.0] ;C FINDS BEAMS.
18900 JRST HX191N
19000 FDVR JK,[=10.0] ;X=RG/10.
19100 FIXX(JK) ;C STEM DIRECT.
19200 MOVEM JK,ALF+=19 ;X SAVED IN ALF+=19
19300 MOVE JK,1(R) ;R2=RN(L+2)
19400 MOVEM JK,.COMM. ; USED IN 'FINDIT'
19500 MOVE A,2(R) ;A=RN(L+3)-.01
19600 FSBR A,[=0.01]
19700 MOVEM A,ALF+=20 ;SAVE A IN ALF+=20
19800 MOVE JK,5(R) ;B=RN(L+6)+.01
19900 FADR JK,[=0.01] ;C POS 1 AND 2
20000 MOVEM JK,ALF+=12 ;B SAVED IN ALF+=12
20100 FSBR JK,A ;DISX=B-A
20200 MOVEM JK,ALF+=18 ;DISX SAVED IN ALF+=18
20300 ; DISTANCE IN REAL STEPS
20400 MOVEM R,ALF+7 ;SAVE LOC OF RN(L+1)
20500 MOVE 0,3(R)
20600 MOVEM 0,ALF+=17
20700 JSA 16,AMOD ;RF=AMOD(RN(L+4),100.0)
20800 JUMP ALF+=17
20900 JUMP [=100.0]
21000 MOVEM 0,ALF+=17 ; THIS IS RF!!!!
21100 ; NOTE 2
21200 MOVE JK,ALF+7
21300 MOVE JK,4(JK)
21400 MOVEM JK,ALF+7
21500 JSA 16,AMOD ;RB=AMOD(RN(L+5),100.0)
21600 JUMP ALF+7
21700 JUMP [=100.0] ;0 WILL HAVE RB!!!
21800 FSBR 0,ALF+=17
21900 MOVEM 0,ALF+=9 ;RD SAVED IN ALF+=9 -- RD=RB-RF
22000 SKIPL ALF+1 ;BEAM TO OTHER STAFF?
22100 JRST H192N-1 ; NO
22200 MOVE MM,ALF ; RESETS STEM DIR FOR NOTE COMPARISON.
22300 MOVEM MM,ALF+=19
22400 MOVE ALF+5 ; STAFF # FOR NOTES
22500 MOVEM .COMM. ; FOR 'FINDIT'
22600 SOJ MM,
22700 MOVE ALF+=14 ; KEEP IT IN AC0 FOR A MINUTE
22800 H3: JUMPN MM,H1 ; JUMP IF STEM OF BEAM IS DOWN
22900 MOVN ALF+=14 ; SUBTR. ALF+=14 FROM RIGHT SIDE POS.
23000 FADRM ALF+=18 ; ADD TO TOTAL BEAM LENGTH
23100 MOVN ALF+=14 ; SUBTR. ALF+=14 FROM RIGHT SIDE POS.
23200 FADRM ALF+=12
23300 JRST H2
23400
23500 H1: FADRM ALF+=12 ; OPPOSITE OF ABOVE
23600 MOVE ALF+=14
23700 FADRM ALF+=18
23800 H2: MOVE ALF+=15 ; ADD TO HGT OF LEFT SIDE OF BEAM FOR STAFF DIFF.
23900 FADRM ALF+=17 ; PUT IT AWAY
24000 MOVEI NX,1
24100 ;;H192N: MOVEM NX,DPYNEW ; DO 192 N=1,ITEM
24200 H192N: JSA 16,FINDIT ;IF(FINDIT(N))GO TO 192
24300 JUMP NX
24400 JUMPL 0,HX192N
24500 MOVEI R,XRN ;IF(RN(L).EQ.8)GO TO 192
24600 ADD R,PTR+=251 ;LOC OF RN(L+1)
24700 MOVE JK,-1(R)
24800 CAMN JK,[=8.0]
24900 JRST HX192N
25000 MOVE JK,7(R) ;IF(RN(L+8).EQ.1000.)GO TO 192
25100 CAMN JK,[=1000.0]
25200 JRST HX192N ; SKIPS SLASHED GRACE NOTES (P8=1000 OR P10=1)
25300 ; FINDIT IS NEG. IF(RN(L+1).NE.1.OR.RN(L+3))
25400 MOVE A,2(R) ;RC=RN(L+3)
25500 CAMGE A,ALF+=20 ;IF(RC.LT.A)GO TO 192
25600 JRST HX192N
25700 CAMLE A,ALF+=12 ;IF(RC.GT.B)GO TO 192
25800 JRST HX192N ; WHAT'S LEFT IS IN BEAM AREA IF STEM DIR. IS OK.
25900 MOVE JK,4(R) ;IF(X.NE.IFIX(RN(L+5)/10.))GO TO 192
26000 FDVR JK,[=10.0]
26100 FIXX(JK)
26200 CAME JK,ALF+=19
26300 JRST HX192N
26400 FSBR A,ALF+=20 ;RC=RC-A
26500 MOVEM A,ALF+6 ;SAVES RC
26600 MOVEM R,ALF+7 ;SAVE LOC OF RN(L+1)
26700 MOVE 0,3(R)
26800 MOVEM 0,ALF+5
26900 JSA 16,AMOD ;193 RE=AMOD(RN(L+4),100.0)
27000 JUMP ALF+5
27100 JUMP [=100.0]
27200 MOVEM 0,ALF+3 ;RE SAVE HERE
27300 MOVE JK,ALF+=9 ;RC=RD*RC/DISX+RF
27400 FMPR JK,ALF+6 ;*RC
27500 FDVR JK,ALF+=18 ;/DISX
27600 FADR JK,ALF+=17 ;+RF
27700 MOVEM JK,ALF+6 ;RC=
27800 MOVE JK,ALF+7
27900 MOVE JK,6(JK) ;RG=RN(L+7)
28000 MOVEM JK,ALF+4 ;SAVE RG
28100 JSA 16,AMOD ;RN(L+7)=RG-AMOD(RG,10.0)+AMOD(RG,1.0)
28200 JUMP ALF+4
28300 JUMP [=10.0]
28400 MOVEM 0,ALF+=10
28500 JSA 16,AMOD
28600 JUMP ALF+4
28700 JUMP [=1.0]
28800 FSBR 0,ALF+=10
28900 FADR 0,ALF+4
29000 MOVE L,ALF+7
29100 MOVEM 0,6(L) ;DELETES TAILS WITHOUT REMOVING DOTS OR SPACING OF DOTS.
29200 ; FRACTIONAL NOTE #
29300 MOVE R,ALF+6 ;195 RA=RC-RE
29400 FSBR R,ALF+3
29500 MOVE JK,ALF+=19 ;IF(X.EQ.2)RA=-RA
29600 CAIN JK,2
29700 MOVNS R
29800 SKIPN R ;IF(RA.EQ.0)RA=999.
29900 MOVE R,[=999.0]
30000 MOVEM R,7(L) ;196 RN(L+8)=RA
30100 ; FRACTIONAL NOTE # - FIRST NOTE OF GROUP + THIS NOTE # ALL *7.
30200 CAMGE NX,POSI+=8 ;IS THIS A LOWER ITEM NUMB. (FOR 2-PASS SYS)
30300 MOVEM NX,POSI+=8 ; SAVES # OF LOWEST ITEM FOUND
30400 HX192N: CAMGE NX,PTR+=250 ;192 CONTINUE
30500 AOJA NX,H192N
30600 HX191N: MOVE K,ALF+=11 ;191 CONTINUE
30700 SKIPE ALF+1 ; WERE WE LOOKING AT BEAM TO OTHER STAFF?
30800 JRST H6 ; YES
30900 CAMGE K,PTR+=250
31000 AOJA K,H191N
31100 JRA 16,(16) ;RETURN
31200
31300 H6: SKIPLE ALF+1 ; HAS THE FLAG BEEN CHANGED
31400 JRA 16,(16)
31500 MOVEM K,ALF+1 ; PUT ANY POS NUM IN IT.
31600 MOVE ALF+=8 ; GET STAFF NUM OF BEAM
31700 MOVEM .COMM. ; PUT IT BACK IN R2
31800 JRST H191N ;GO BACK TO CHECK OTHER STAFF'S STEMS.
31900 END